#include<iostream>
#include<cstring>

using namespace std ;

const int maxn = 100010 ;
const int maxm = maxn * 2 ; //边的数量最多是点的两倍

/**
* 邻接表法存储
*/

int h[maxn] ;   //存放每个单链表的头结点
int e[maxm] ;   //每个节点的值
int ne[maxm] ;  //每个结点的next指针
int idx ;
bool st[maxn] ;

//深度优先搜索
void dfs(int index ) {
    st[index] = true ;

    for(int i = h[index] ; i != -1 ; i = ne[i]) {
        int j = e[i] ;
        if(st[j] == false) {
            dfs(j) ;
        }
    }
}

//在 a b 之间插入一条边
void add(int a , int b ) {
    //先分配一个结点的值设为 b
    //这个新建的点再指向 a 的头结点
    //a 的头结点再指向这个地址

    /**
     * 原理就是每次要建一条边的时候就把这条边的终端节点给 new 出来
     * 再用头插法连起来
     */
    e[idx] = b ;
    ne[idx] = h[a] ;
    h[a] = idx ;
    idx ++ ;
}

int main() {

    memset(h , -1 , sizeof h) ;     //先让每个单链表的头结点指向空

    return 0 ;
}